home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / utils / bin2asm / bin2asm.c < prev    next >
C/C++ Source or Header  |  1994-02-02  |  10KB  |  367 lines

  1. /*---------------------------------------------------------------------------
  2.  * BIN2ASM.C - a utility to convert .SCR raw pics to a variable size ASM
  3.  * or C data file.
  4.  *
  5.  * Needs: a VGA viewer, and VGACAP.COM
  6.  *
  7.  * This is a simple util that I use to cut up pictures for use in my work.
  8.  * I have some other preprocessing deals to make them unchained mode, but
  9.  * these will get you going on putting pics in your loaders. All you need
  10.  * to do is run a viewer (this archive should have come with SVGA.EXE) and
  11.  * screen capture using VGACAP.COM, and then use this to convert it. This
  12.  * is very rudimentary, but it fits my needs and I dont feel the need to
  13.  * increase it... Also, some basic color reduction is done. (Empty colors
  14.  * are removed.) I was going to remove duplicates, but I decided to wait
  15.  * until I had a good algorithm for overall color reduction. Works for me,
  16.  * but you're welcome to modify it to your needs, as long as you greet me
  17.  * or Shadow Faction. :)
  18.  *
  19.  * -Friar Tuck/Shadow Faction (sparkss@snyalfva.cc.alfredtech.edu)
  20.  *
  21.  *--------------------------------------------------------------------------*/
  22. #include <io.h>
  23. #include <mem.h>
  24. #include <alloc.h>
  25. #include <stdio.h>
  26. #include <fcntl.h>
  27. #include <string.h>
  28. #include <process.h>
  29. #include "vidstuff.c"
  30. #include "mouse.h"
  31.  
  32. #define C_DATA      1
  33. #define ASM_DATA    2
  34.  
  35. // color flags
  36. #define USED        1
  37. #define FIXED       2
  38.  
  39. unsigned char colorflags[256];
  40. unsigned char far *screen;
  41. unsigned char far *video = (char far *)0xA0000000;
  42. unsigned char far *pal;
  43. unsigned char temppal[768];
  44. char output_type = ASM_DATA;
  45. int colors = 0;
  46.  
  47. void compress_image(int x1, int y1, int x2, int y2)
  48.     {
  49.     unsigned int x,y,p;
  50.     unsigned int px,py;
  51.     unsigned char pc;
  52.     unsigned int cc1=0,cc2=0;
  53.  
  54.     colors=0;
  55.     for(x=0;x<255;x++) colorflags[x]=0;
  56.  
  57.     // First, count the number of colors in the section
  58.     for(y=y1;y<=y2;y++)
  59.         for (x=x1;x<=x2;x++)
  60.             {
  61.             p=y*320+x;
  62.             pc=screen[p];
  63.             if(!colorflags[pc]) {
  64.                 colors++;
  65.                 colorflags[pc]=1;
  66.                 }
  67.             }
  68.     printf("%d colors used -",colors);
  69.     // Then, begin compressing...
  70.     // cc1 = current color optimized
  71.     // cc2 = swapcolor
  72.     for (cc1=0;cc1<256;cc1++)
  73.         {
  74.         // Do we need to move this color?
  75.         if(colorflags[cc1])
  76.             {
  77.             if(cc1!=cc2) {
  78.              // Update the actual palette entries...
  79.              pal[(cc2*3)]=pal[(cc1*3)];
  80.              pal[(cc2*3)+1]=pal[(cc1*3)+1];
  81.              pal[(cc2*3)+2]=pal[(cc1*3)+2];
  82.              pal[(cc1*3)]=0;
  83.              pal[(cc1*3)+1]=0;
  84.              pal[(cc1*3)+2]=0;
  85.              // Update the picture
  86.              for (x=x1;x<=x2;x++)
  87.                  for(y=y1;y<=y2;y++)
  88.                      {
  89.                      p=y*320+x;
  90.                      pc=screen[p];
  91.                      if(pc==cc1) screen[p]=cc2;
  92.                      }
  93.              cc2++;
  94.              }
  95.             switch(cc2%4) {
  96.                 case 0: printf("\b/");
  97.                         break;
  98.                 case 1: printf("\b-");
  99.                         break;
  100.                 case 2: printf("\b\\");
  101.                         break;
  102.                 case 3: printf("\b|");
  103.                         break;
  104.                 }
  105.             }
  106.         }
  107.     }
  108.  
  109. int F_WriteAsmImage(int x1, int y1, int x2, int y2, char *filename)
  110.     {
  111.     int tmp,t2,x,y;
  112.     FILE *outfile;
  113.  
  114.     if(x1>x2) { tmp=x1;x1=x2;x2=tmp; }
  115.     if(y1>y2) { tmp=y1;y1=y2;y2=tmp; }
  116.  
  117.  
  118.     printf("Compressing image...");
  119.     compress_image(x1,y1,x2,y2);
  120.     printf("\b- Done.\nWriting image...");
  121.     outfile=fopen(filename,"w");
  122.     if (outfile==NULL) {
  123.         tmode();
  124.         printf("Error opening to %s\n",filename);
  125.         exit(0);
  126.         }
  127.     fprintf(outfile,"\t;---------------------------------------;\n");
  128.     fprintf(outfile,"\t; BIN2ASM Friar Tuck/Shadow Faction     ;\n");
  129.     fprintf(outfile,"\t; Filename: %13s\t\t;\n",filename);
  130.     fprintf(outfile,"XSIZE equ %d\n",x2-x1+1);
  131.     fprintf(outfile,"YSIZE equ %d\n",y2-y1+1);
  132.     fprintf(outfile,"TOTALBYTES equ %d\n",(x2-x1+1)*(y2-y1+1));
  133.     fprintf(outfile,"COLORS equ %d\n\n",colors);
  134.  
  135.     fprintf(outfile,"BA_PAL label byte\n\tdb\t");
  136.     for(x=0;x<colors*3;x++)
  137.         {
  138.         fprintf(outfile,"%3d",pal[x]);
  139.         if(x%12==11) {
  140.             fprintf(outfile,"\n\tdb\t");
  141.             }
  142.         else fprintf(outfile,",");
  143.         }
  144.  
  145.     fprintf(outfile,"0\n\nBA_SCR label byte\n\tdb\t");
  146.     for(y=y1;y<=y2;y++) {
  147.         tmp=0;
  148.         for(x=x1;x<=x2;x++) {
  149.             t2 = y*320+x;
  150.             fprintf(outfile,"%3d",screen[t2]);
  151.             if(tmp%16==15&&x!=x2)
  152.                 fprintf(outfile,"\n\tdb\t");
  153.             else if(x!=x2)
  154.                 fprintf(outfile,",");
  155.             tmp++;
  156.             }
  157.         if(y!=y2) fprintf(outfile,"\n\n\tdb\t");
  158.         else fprintf(outfile,"\n\n\t; END RUN\n");
  159.         }
  160.     fclose(outfile);
  161.     return(0);
  162.     }
  163.  
  164. int F_WriteCImage(int x1, int y1, int x2, int y2, char *filename)
  165.     {
  166.     int tmp,t2,x,y;
  167.     FILE *outfile;
  168.  
  169.     if(x1>x2) { tmp=x1;x1=x2;x2=tmp; }
  170.     if(y1>y2) { tmp=y1;y1=y2;y2=tmp; }
  171.  
  172.  
  173.     printf("Compressing image...");
  174.     compress_image(x1,y1,x2,y2);
  175.     printf("\b- Done.\nWriting image...");
  176.     outfile=fopen(filename,"w");
  177.     if (outfile==NULL) {
  178.         tmode();
  179.         printf("Error opening to %s\n",filename);
  180.         exit(0);
  181.         }
  182.     fprintf(outfile,"\t//--------------------------------------\n");
  183.     fprintf(outfile,"\t// BIN2ASM Friar Tuck/Shadow Faction    \n");
  184.     fprintf(outfile,"\t// Filename: %13s\n",filename);
  185.     fprintf(outfile,"#define XSIZE %d\n",x2-x1+1);
  186.     fprintf(outfile,"#define YSIZE %d\n",y2-y1+1);
  187.     fprintf(outfile,"#define TOTALBYTES %d\n",(x2-x1+1)*(y2-y1+1));
  188.     fprintf(outfile,"#define COLORS %d\n\n",colors);
  189.  
  190.     fprintf(outfile,"unsigned char ba_pal[]={\n\t");
  191.     for(x=0;x<colors*3;x++)
  192.         {
  193.         fprintf(outfile,"%3d",pal[x]);
  194.         if(x%12==11) {
  195.             fprintf(outfile,",\n\t");
  196.             }
  197.         else fprintf(outfile,",");
  198.         }
  199.  
  200.     fprintf(outfile,"0 }\n\nunsigned char ba_scr[]={\n\t");
  201.     for(y=y1;y<=y2;y++) {
  202.         tmp=0;
  203.         for(x=x1;x<=x2;x++) {
  204.             t2 = y*320+x;
  205.             fprintf(outfile,"%3d",screen[t2]);
  206.             if(tmp%16==15&&x!=x2)
  207.                 fprintf(outfile,",\n\t");
  208.             else if(x!=x2)
  209.                 fprintf(outfile,",");
  210.             tmp++;
  211.             }
  212.         if(y!=y2) fprintf(outfile,",\n\n\t");
  213.         else fprintf(outfile,"\n\t}\n\t// END RUN\n");
  214.         }
  215.     fclose(outfile);
  216.     return(0);
  217.     }
  218.  
  219. int ox1=1,ox2=1,oy1=1,oy2=1;
  220.  
  221. void V_BoxOn(int x1,int y1, int x2, int y2)
  222.     {
  223.     int x,y,p1,p2;
  224.  
  225.     if(x1>x2) { p1=x1;x1=x2;x2=p1; }
  226.     if(y1>y2) { p1=y1;y1=y2;y2=p1; }
  227.  
  228.     p1=y1*320+x1;
  229.     p2=y2*320+x1;
  230.     for(x=x1;x<=x2;x++)
  231.         {
  232.         video[p1]=15;
  233.         video[p2]=15;
  234.         p1++;
  235.         p2++;
  236.         }
  237.     p1=y1*320+x1;
  238.     p2=y1*320+x2;
  239.     for(y=y1;y<=y2;y++)
  240.         {
  241.         video[p1]=15;
  242.         video[p2]=15;
  243.         p1+=320;
  244.         p2+=320;
  245.         }
  246.     ox1=x1;
  247.     ox2=x2;
  248.     oy1=y1;
  249.     oy2=y2;
  250.     }
  251.  
  252. void V_BoxOff(void)
  253.     {
  254.     int x,y,p1,p2;
  255.  
  256.     p1=oy1*320+ox1;
  257.     p2=oy2*320+ox1;
  258.     for(x=ox1;x<=ox2;x++)
  259.         {
  260.         video[p1]=screen[p1];
  261.         video[p2]=screen[p2];
  262.         p1++;
  263.         p2++;
  264.         }
  265.     p1=oy1*320+ox1;
  266.     p2=oy1*320+ox2;
  267.     for(y=oy1;y<=oy2;y++)
  268.         {
  269.         video[p1]=screen[p1];
  270.         video[p2]=screen[p2];
  271.         p1+=320;
  272.         p2+=320;
  273.         }
  274.     }
  275.  
  276. int V_blockarea(char *outname)
  277.     {
  278.     int x1,y1,x2,y2,restart;
  279.  
  280.     M_Init();
  281.     M_ShowCursor();
  282.  
  283.     restart=1;
  284.     while(restart!=0) {
  285.         restart=0;
  286.         M_GetButtonPress(LEFT_BUTTON);
  287.         x1=M_CurX/2;
  288.         y1=M_CurY;
  289.         while(M_CurButtons&LEFT_BUTTON)
  290.             M_GetCurPos();
  291.  
  292.         while(!M_CurButtons) {
  293.             M_GetCurPos();
  294.             waitvrt();
  295.             M_HideCursor();
  296.             V_BoxOff();
  297.             x2=M_CurX/2;
  298.             y2=M_CurY;
  299.             M_ShowCursor();
  300.             V_BoxOn(x1,y1,x2,y2);
  301.             if(M_CurButtons&RIGHT_BUTTON) restart=1;
  302.             }
  303.         if(restart) V_BoxOff();
  304.         }
  305.     M_Init();
  306.     tmode();
  307.     if(output_type==ASM_DATA) F_WriteAsmImage(x1,y1,x2,y2,outname);
  308.     else F_WriteCImage(x1,y1,x2,y2,outname);
  309.     return(0);
  310.     }
  311.  
  312.  
  313. int F_Loadraw(char *fname)
  314.     {
  315.     int fh;
  316.  
  317.     fh=_open(fname,O_RDONLY);
  318.     if(fh==NULL) return(-1);
  319.  
  320.     screen=farmalloc(64000);
  321.     if(screen==NULL) return(-1);
  322.     pal=farmalloc(768);
  323.     if(pal==NULL) return(-1);
  324.  
  325.     _read(fh,pal,768);
  326.     _read(fh,screen,64000);
  327.     return(0);
  328.     }
  329.  
  330. int V_Drawscreen(void)
  331.     {
  332.     int x;
  333.  
  334.     grmode();
  335.  
  336.     asm {
  337.         mov dx,03C8h
  338.         xor ax,ax
  339.         out dx,al
  340.         inc dx
  341.         }
  342.     for(x=0;x<768;x++)
  343.         {
  344.         _AL=pal[x];
  345.         asm out dx,al
  346.         }
  347.     _fmemcpy(video,screen,64000);
  348.     return(0);
  349.     }
  350.  
  351. void main(int argc,char **argv)
  352.     {
  353.     if(argc<3) {
  354.         printf("BIN2ASM, (c) 1994 Friar Tuck/Shadow Faction\n");
  355.         printf("\nUsage: BIN2ASM infile.SCR outfile.??? [C]\n");
  356.         printf(" the 'C' flag creates a C header file. Default is Assembly\n");
  357.         printf(" format.\n");
  358.         printf("\n");
  359.         exit(0);
  360.         }
  361.     if(!strcmpi(argv[3],"C")) output_type=C_DATA;
  362.     if(F_Loadraw(argv[1])==-1) exit(0);
  363.     V_Drawscreen();
  364.     V_blockarea(argv[2]);
  365.     }
  366.  
  367.